﻿using System;
using System.Collections.Generic;
using System.Text;

using Sinacor.Servico.Bovespa.Ordens.BusinessEntity;
using Sinacor.Servico.Bovespa.Ordens.Service.DataContract.Request;
using Sinacor.Servico.Bovespa.Ordens.Service.DataContract.Response;


namespace Sinacor.Servico.Bovespa.Ordens.Service.ServiceImplementation.Translator
{
    /// <summary>
    /// TODO: Classe aguardando especificacao oficial
    /// </summary>
    public class TranslateLoteDigitacao : TranslateBaseDigitacao
    {
        /// <summary>
        /// Transforma uma instância de "DataContract.Request.LoteDigitacao" em uma instância de "BusinessEntity.LoteDigitacao"
        /// </summary>
        /// <param name="pRequest"></param>
        /// <returns></returns>
        public BusinessEntity.LoteDigitacao ToEntity(DataContract.Request.InserirLoteDigitacao pRequest) 
        {            
            BusinessEntity.LoteDigitacao response = new BusinessEntity.LoteDigitacao();
            base.ToEntity(pRequest, (BusinessEntity.BaseDigitacao) response);
            response.NumeroConjunto = pRequest.NumeroConjunto.Value;

            return response;
        }

        /// <summary>
        /// Transforma uma lista de "DataContract.Request.LoteDigitacao" em uma lista de "BusinessEntity.LoteDigitacao"
        /// </summary>
        /// <param name="pRequest"></param>
        /// <returns></returns>
        public List<BusinessEntity.LoteDigitacao> ToEntity(List<DataContract.Request.InserirLoteDigitacao> pRequest)
        {
            List<BusinessEntity.LoteDigitacao> responseList = new List<BusinessEntity.LoteDigitacao>();

            foreach (DataContract.Request.InserirLoteDigitacao loteDigitacao in pRequest)
            {
                responseList.Add(this.ToEntity(loteDigitacao));
            }

            return responseList;
        }
        /// <summary>
        /// Transoformar um List<BusinessEntity.Parameter.ConsultarLoteDigitacao> em List<DataContract.Request.ConsultarLoteDigitacaoRequest> 
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>

        public List<BusinessEntity.Parameter.ConsultarLoteDigitacao> ToParameter( List<DataContract.Request.ConsultarLoteDigitacaoRequest> request) 
        {
            List<BusinessEntity.Parameter.ConsultarLoteDigitacao> response = new List<Sinacor.Servico.Bovespa.Ordens.BusinessEntity.Parameter.ConsultarLoteDigitacao>();

            foreach (DataContract.Request.ConsultarLoteDigitacaoRequest par in request)
            {
                response.Add(ToParameter(par));
            }
            return response; 
        }

        /// <summary>
        /// Transforma um "DataContract.Request.LoteDigitacao pRequest" em "BusinessEntity.Parameter.ConsultarLoteDigitacao"
        /// </summary>
        /// <param name="pRequest"></param>
        /// <returns></returns>
        public BusinessEntity.Parameter.ConsultarLoteDigitacao ToParameter (
            DataContract.Request.ConsultarLoteDigitacaoRequest pRequest
        )
        {
            BusinessEntity.Parameter.ConsultarLoteDigitacao param = new BusinessEntity.Parameter.ConsultarLoteDigitacao();
            param.NumeroConjunto = pRequest.NumeroConjunto;
            return param;
        }


        /// <summary>
        /// Transforma uma instância de "BusinessEntity.LoteDigitacao" em uma instância de "DataContract.Request.LoteDigitacao" 
        /// </summary>
        /// <param name="loteDigitacao"></param>
        /// <returns></returns>
        private DataContract.Response.LoteDigitacaoResponse ToResponse(BusinessEntity.LoteDigitacao loteDigitacao)
        {
            DataContract.Response.LoteDigitacaoResponse response = new DataContract.Response.LoteDigitacaoResponse();

            response.ApelidoCliente = loteDigitacao.ApelidoCliente;
            response.CodigoAgenteCustodia = loteDigitacao.CodigoAgenteCustodia;
            response.CodigoCarteira = loteDigitacao.CodigoCarteira;
            response.CodigoCliente = loteDigitacao.CodigoCliente;
            response.CodigoClienteCustodia = loteDigitacao.CodigoClienteCustodia;
            response.DataMovimento = loteDigitacao.DataMovimento;
            response.DigitoClienteCustodia = loteDigitacao.DigitoClienteCustodia;
            response.DigitoVerificadorCliente = loteDigitacao.DigitoVerificadorCliente;
            response.IndicadorNaoLiquidacao = loteDigitacao.IndicadorNaoLiquidacao;
            response.IndicadorSistemaExterno = loteDigitacao.IndicadorSistemaExterno;
            response.NumeroConjunto = loteDigitacao.NumeroConjunto;
            response.NumeroSequenciaDigitacao = loteDigitacao.NumeroSequenciaDigitacao;   
            response.QuantidadeDestinadaCliente =  loteDigitacao.QuantidadeDestinadaCliente;
            response.PercentualAcrescimo = loteDigitacao.PercentualAcrescimo;
            response.PrecoInformado = loteDigitacao.PrecoInformado;
            response.TipoLiquidacao = (DataContract.Enum.TipoLiquidacaoDistribuicao?)loteDigitacao.TipoLiquidacao;
            response.PercentualDistribuido = loteDigitacao.PercentualDistribuido;
            response.ValorDolar = loteDigitacao.ValorDolar; 
 
         


            return response;
        }
       




        /// <summary>
        /// Transforma uma lista de "BusinessEntity.LoteDigitacao" em uma lista de "DataContract.Request.LoteDigitacao" 
        /// </summary>
        /// <param name="list"></param>
        /// <returns></returns>        
        public List<DataContract.Response.LoteDigitacaoResponse> ToResponse(List<BusinessEntity.LoteDigitacao> list)
        {
            List<DataContract.Response.LoteDigitacaoResponse> responseList = new List<DataContract.Response.LoteDigitacaoResponse>();

            foreach (BusinessEntity.LoteDigitacao loteDigitacao in list)
            {
                responseList.Add(this.ToResponse(loteDigitacao));
            }

            return responseList;
        }

        // TASK 1289
        public List<BusinessEntity.Parameter.ExcluirLoteDigitacao> ToParameter(List<DataContract.Request.ExcluirLoteDigitacao> pListExcluirLoteDigitacao)
        {
            List<BusinessEntity.Parameter.ExcluirLoteDigitacao> responseList = new List<BusinessEntity.Parameter.ExcluirLoteDigitacao>();

            foreach (DataContract.Request.ExcluirLoteDigitacao xLoteDigitacao in pListExcluirLoteDigitacao)
            {
                responseList.Add(this.ToParameter(xLoteDigitacao));
            }

            return responseList;
        }

        // TASK 1289
        private Sinacor.Servico.Bovespa.Ordens.BusinessEntity.Parameter.ExcluirLoteDigitacao ToParameter(DataContract.Request.ExcluirLoteDigitacao xLoteDigitacao)
        {
            BusinessEntity.Parameter.ExcluirLoteDigitacao parm = new BusinessEntity.Parameter.ExcluirLoteDigitacao();

            parm.DataOrdem = xLoteDigitacao.DataOrdem;
            parm.NumeroConjunto = xLoteDigitacao.NumeroConjunto;
            parm.NumeroSequenciaDistribuicao = xLoteDigitacao.NumeroSequenciaDistribuicao;
            parm.TipoDistribuicao = (BusinessEntity.Enum.TipoDistribuicao)new System.ComponentModel.EnumConverter(xLoteDigitacao.TipoDistribuicao.GetType()).ConvertFrom(xLoteDigitacao.TipoDistribuicao.ToString()); 

            return parm;
        }

        
    }
}
